// 创建vue组件api
let uid = 0 // 全局唯一标识 每次创建一个实例 加一
/**
 * @description 创建vue组件 内部api的方法
 * @returns 创建Vue App的方法
 */
export function createAppAPI(render) {
    return function createApp(rootComponent) {
        // 上下文对象 -- 随便写几个意思一下
        const context = {
            provides: {},
            components: {},
            directives: {},
            plugins: new Set(), // 插件去重其他可被覆盖
            mixins: []
        }

        // 实例上的数据和方法
        const app = {
            _uid: uid++, // 每个vue组件的唯一标识
            _context: context, // 组件的上下文
            mount (rootContainer) {
                // 节点挂在
                /**
                 * 1. 创建虚拟节点
                 * 2. 给虚拟节点挂载context
                 * 3. 节点渲染
                 */
                 const vnode = createVNode(rootComponent)
                 vnode.appContext = context //全局的context
                 render(vnode, rootContainer)
                return app
            },
            // 插件注册
            use(plugins, options) {
                /**
                 * 1. 判断插件是否已经存在
                 * 2. 不存在则添加插件
                 * 3. 调用插件的install 方法 完成注册
                 */
                if(context.plugins.has(plugins)) {
                    context.plugins.add(plugins)
                    plugins.install(app, ...options)
                }
                return app
            },
            // 简单的数据存储
            provide (key, val) {
                // 将数据存储到 context 中
                context.provides[key] = val
                return app
            },
            // 组件注册
            component(name, component) {
                // 注册的组件存储在context 上
                context.components[name] = component
                return app
            },
            // ... 其他的类似
            
        }
        return app

    }
}